home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 07 - 1991 / 07.04 Apr 91 / Jorg Code / TBox.cp next >
Encoding:
Text File  |  1991-02-22  |  8.8 KB  |  367 lines  |  [TEXT/MPS ]

  1. #include <UMacApp.h>
  2. #include <UTEView.h>
  3. #include <ToolUtils.h>
  4.  
  5. #include "TEDrag.h"
  6.  
  7. const int    kBoxColor        =    redColor;
  8. const int    cSizer            =    4001;
  9.  
  10. // Resizing support, JL 2/91
  11. pascal void TSizer::ISizer(TBox *itsBox, TTEDocument *itsDocument, TTextView *itsView)
  12. {
  13.     TScroller *aScroller;
  14.  
  15.     aScroller = itsView->GetScroller(true);
  16.     ICommand(cSizer, itsDocument, itsView, aScroller);
  17.     fTEDocument = itsDocument;
  18.     fTextView = itsView;
  19.     fBox = itsBox;    
  20.     pT = false; pB = false; pL = false; pR = false;
  21.     oldLocation = fBox->fLocation;    
  22.     newLocation = oldLocation;    
  23. }
  24.  
  25.  
  26. pascal struct TCommand *TSizer::TrackMouse(TrackPhase aTrackPhase,
  27.                             VPoint *anchorPoint, VPoint *previousPoint, 
  28.                             VPoint *nextPoint, Boolean mouseDidMove)
  29. {        
  30.     fStart = fTextView->ViewToQDPt(anchorPoint);
  31.     
  32.     if (aTrackPhase == trackPress)
  33.     {
  34.         if (PtInRect(fStart,&fBox->fTR))
  35.             { pT = true; pR = true; }
  36.         else if (PtInRect(fStart,&fBox->fTL))
  37.             { pT = true; pL = true; }
  38.         else if (PtInRect(fStart,&fBox->fBR))
  39.             { pB = true; pR = true; }
  40.         else if (PtInRect(fStart,&fBox->fBL))
  41.             { pB = true; pL = true; }
  42.         else if (PtInRect(fStart,&fBox->fT))
  43.             { pT = true; }
  44.         else if (PtInRect(fStart,&fBox->fB))
  45.             { pB = true; }
  46.         else if (PtInRect(fStart,&fBox->fL))
  47.             { pL = true; }
  48.         else if (PtInRect(fStart,&fBox->fR))
  49.             { pR = true; }
  50.     }
  51.  
  52.     if ((aTrackPhase == trackMove) && mouseDidMove)
  53.     {
  54.         fDelta = fTextView->ViewToQDPt(nextPoint);
  55.         SubPt(fTextView->ViewToQDPt(anchorPoint),&fDelta);
  56.         
  57.         if ( !((fDelta.h == 0) && (fDelta.v == 0)) )
  58.         {            
  59.             if (pT)
  60.             { newLocation.top = oldLocation.top + fDelta.v; }
  61.             if (pB)
  62.             { newLocation.bottom = oldLocation.bottom + fDelta.v; }
  63.             if (pL)
  64.             { newLocation.left = oldLocation.left + fDelta.h; }
  65.             if (pR)
  66.             { newLocation.right = oldLocation.right + fDelta.h; }
  67.         }
  68.     }
  69.  
  70.     if ((aTrackPhase == trackRelease) && mouseDidMove)
  71.     {
  72.         fDelta = fTextView->ViewToQDPt(nextPoint);
  73.         SubPt(fTextView->ViewToQDPt(anchorPoint),&fDelta);
  74.         
  75.         if ((fDelta.h == 0) && (fDelta.v == 0))
  76.             {    return gNoChanges;    }
  77.             
  78.         fBox->fLocation = newLocation;
  79.     }
  80.     return this;
  81. }
  82.  
  83. pascal void TSizer::TrackFeedback(VPoint *anchorPoint, VPoint *nextPoint,
  84.             Boolean turnItOn, Boolean mouseDidMove)
  85. {
  86.     PenState    oldState;
  87.     
  88.     if (mouseDidMove)
  89.     {
  90.         GetPenState(&oldState);
  91.             PenNormal();
  92.             PenMode(patXor);
  93.             FrameRect(&newLocation);
  94.         SetPenState(&oldState);
  95.     }
  96. }
  97.  
  98. pascal void TSizer::DoIt()
  99. {
  100.     fTextView->InvalidRect(&newLocation);
  101.     fTextView->InvalidRect(&oldLocation);
  102. }
  103.  
  104. pascal void TSizer::RedoIt()  
  105. {      
  106.     fBox->fLocation = newLocation;
  107.     DoIt(); 
  108. }
  109.  
  110. pascal void TSizer::UndoIt()
  111. {    
  112.     fBox->fLocation = oldLocation;
  113.     DoIt(); 
  114. }
  115.  
  116.  
  117. #ifdef qDebug
  118. pascal void TSizer::Fields(pascal void (*DoToField) (StringPtr fieldName,
  119.                         Ptr fieldAddr, short fieldType, void *link), void *link)
  120. {
  121.     DoToField("\pTSizer", nil, bClass, link);
  122.     DoToField("\pfTEDocument", (Ptr) &fTEDocument, bObject, link);
  123.     DoToField("\pfTextView", (Ptr) &fTextView, bObject, link);
  124.     DoToField("\pfBox", (Ptr) &fBox, bObject, link);
  125.     DoToField("\poldLocation", (Ptr) &oldLocation, bRect, link);
  126.     DoToField("\pnewLocation", (Ptr) &newLocation, bRect, link);
  127.     DoToField("\pfStart", (Ptr) &fStart, bPoint, link);
  128.     DoToField("\pfDelta", (Ptr) &fDelta, bPoint, link);
  129.     DoToField("\ppT", (Ptr) &pT, bBoolean, link);
  130.     DoToField("\ppB", (Ptr) &pB, bBoolean, link);
  131.     DoToField("\ppL", (Ptr) &pL, bBoolean, link);
  132.     DoToField("\ppR", (Ptr) &pR, bBoolean, link);
  133.     inherited::Fields(DoToField, link);
  134. }
  135. #endif
  136.  
  137. pascal void TBox::IBox(Rect *itsLocation)
  138.     {      fLocation = *itsLocation;  
  139.         fSelected = false;    }
  140.  
  141. pascal void TBox::DrawShape()
  142. {
  143.     if (fSelected)
  144.         {    
  145.             short halfH, halfV;
  146.             
  147.             halfH = (fLocation.right-fLocation.left)/2;
  148.             halfV = (fLocation.bottom-fLocation.top)/2;
  149.             
  150.             PenSize (1,1);
  151.             ForeColor(blackColor);
  152.             FrameRect(&fLocation);
  153.             
  154.             fTagRgn = MakeNewRgn();
  155.             OpenRgn();
  156.             
  157.             fTL.top = fLocation.top;
  158.             fTL.left = fLocation.left;
  159.             fTL.bottom = fTL.top + 4;
  160.             fTL.right = fTL.left + 4;
  161.             FrameRect(&fTL);
  162.             
  163.             fT.top = fLocation.top;
  164.             fT.bottom = fT.top + 4;
  165.             fT.left = fLocation.left + halfH - 2;
  166.             fT.right = fT.left + 4;
  167.             FrameRect(&fT);
  168.             
  169.             fTR.top = fLocation.top;
  170.             fTR.bottom = fTR.top + 4;
  171.             fTR.right = fLocation.right;
  172.             fTR.left = fTR.right - 4;
  173.             FrameRect(&fTR);
  174.             
  175.             fBL.bottom = fLocation.bottom;
  176.             fBL.top = fBL.bottom - 4;
  177.             fBL.left = fLocation.left;
  178.             fBL.right = fBL.left + 4;
  179.             FrameRect(&fBL);
  180.             
  181.             fB.bottom = fLocation.bottom;
  182.             fB.top = fB.bottom - 4;
  183.             fB.left = fLocation.left + halfH - 2;
  184.             fB.right = fB.left + 4;
  185.             FrameRect(&fB);
  186.             
  187.             fBR.bottom = fLocation.bottom;
  188.             fBR.top = fBR.bottom - 4;
  189.             fBR.right = fLocation.right;
  190.             fBR.left = fBR.right - 4;
  191.             FrameRect(&fBR);
  192.             
  193.             fL.top = fLocation.top + halfV - 2;
  194.             fL.bottom = fL.top + 4;
  195.             fL.left = fLocation.left;
  196.             fL.right = fL.left + 4;
  197.             FrameRect(&fL);
  198.             
  199.             fR.top = fLocation.top + halfV - 2;
  200.             fR.bottom = fR.top + 4;
  201.             fR.right = fLocation.right;
  202.             fR.left = fR.right - 4;
  203.             FrameRect(&fR);
  204.             
  205.             CloseRgn(fTagRgn);
  206.             
  207.             FillRgn(fTagRgn,qd.black);
  208.             
  209.             ForeColor(kBoxColor);    }
  210. }
  211.  
  212. pascal void TBox::NeedDiskSpace(long *data)
  213. {
  214.     data = data + sizeof(fLocation) + sizeof(fSelected);
  215. }
  216.  
  217. pascal void TBox::Read(short aRefNum)
  218. {
  219.     long bytes;
  220.     
  221.     bytes = sizeof(fLocation);    // bytes to store location
  222.     FailOSErr(FSRead(aRefNum, &bytes, (Ptr) &fLocation));
  223. }
  224.  
  225.  
  226. pascal void TBox::Write(short aRefNum)
  227. {
  228.     long bytes;
  229.     
  230.     bytes = sizeof(fLocation);    // bytes to store location
  231.     FailOSErr(FSWrite(aRefNum, &bytes, (Ptr) &fLocation));
  232. }
  233.  
  234. #ifdef qDebug
  235. pascal void TBox::Fields(pascal void (*DoToField) (StringPtr fieldName,
  236.                         Ptr fieldAddr, short fieldType, void *link), void *link)
  237. {
  238.     DoToField("\pTBox", nil, bClass, link);
  239.     DoToField("\pfLocation", (Ptr) &fLocation, bRect, link);
  240.     DoToField("\pfSelected", (Ptr) &fSelected, bBoolean, link);
  241.     DoToField("\pfTagRgn", (Ptr) &fTagRgn, bRgnHandle, link);
  242.     DoToField("\pfTL", (Ptr) &fTL, bRect, link);
  243.     DoToField("\pfTR", (Ptr) &fTR, bRect, link);
  244.     DoToField("\pfBL", (Ptr) &fBL, bRect, link);
  245.     DoToField("\pfBR", (Ptr) &fBR, bRect, link);
  246.     DoToField("\pfT", (Ptr) &fT, bRect, link);
  247.     DoToField("\pfB", (Ptr) &fB, bRect, link);
  248.     DoToField("\pfL", (Ptr) &fL, bRect, link);
  249.     DoToField("\pfR", (Ptr) &fR, bRect, link);
  250.     inherited::Fields(DoToField, link);
  251. }
  252. #endif
  253.  
  254.  
  255. pascal void TShape::NeedDiskSpace(long *data)
  256. {
  257.     inherited::NeedDiskSpace(data);
  258.     data = data + sizeof(fPenSize) 
  259.                 + sizeof(fPenPat) + sizeof(fFillPat);
  260. }
  261.  
  262. pascal void TShape::IBox(Rect *itsLocation)
  263.     {  
  264.         fLocation = *itsLocation;  
  265.         fPenSize = 1;
  266.         
  267.         for (int i = 0; i<8 ; i++)
  268.             { fPenPat[i]  = qd.black[i];
  269.               fFillPat[i] = qd.gray[i];
  270.              }
  271.         inherited::IBox(itsLocation);
  272.     }
  273.  
  274. #ifdef qDebug
  275. pascal void TShape::Fields(pascal void (*DoToField) (StringPtr fieldName,
  276.                         Ptr fieldAddr, short fieldType, void *link), void *link)
  277. {
  278.     DoToField("\pTShape", nil, bClass, link);
  279.     DoToField("\pfPenSize", (Ptr) &fPenSize, bInteger, link);
  280.     DoToField("\pfPenPat", (Ptr) &fPenPat, bPattern, link);
  281.     DoToField("\pfFillPat", (Ptr) &fFillPat, bPattern, link);
  282.     inherited::Fields(DoToField, link);
  283. }
  284. #endif
  285.  
  286.  
  287. pascal void TRect::DrawShape()
  288. {
  289.     PenSize (fPenSize,fPenSize);
  290.     PenPat (fPenPat);
  291.     FillRect(&fLocation,fFillPat);
  292.     FrameRect(&fLocation);
  293.     inherited::DrawShape();
  294. }
  295.  
  296. pascal void TRect::NeedDiskSpace(long *data)
  297. {
  298.     inherited::NeedDiskSpace(data);
  299. }
  300.  
  301. #ifdef qDebug
  302. pascal void TRect::Fields(pascal void (*DoToField) (StringPtr fieldName,
  303.                         Ptr fieldAddr, short fieldType, void *link), void *link)
  304. {
  305.     DoToField("\pTRect", nil, bClass, link);
  306.     inherited::Fields(DoToField, link);
  307. }
  308. #endif
  309.  
  310.  
  311. pascal void TOval::DrawShape()
  312. {
  313.     PenSize (fPenSize,fPenSize);
  314.     PenPat (fPenPat);
  315.     FillOval(&fLocation,fFillPat);
  316.     FrameOval(&fLocation);
  317.     inherited::DrawShape();
  318. }
  319.  
  320. pascal void TOval::NeedDiskSpace(long *data)
  321. {
  322.     inherited::NeedDiskSpace(data);
  323. }
  324.  
  325. #ifdef qDebug
  326. pascal void TOval::Fields(pascal void (*DoToField) (StringPtr fieldName,
  327.                         Ptr fieldAddr, short fieldType, void *link), void *link)
  328. {
  329.     DoToField("\pTOval", nil, bClass, link);
  330.     inherited::Fields(DoToField, link);
  331. }
  332. #endif
  333.  
  334.  
  335. pascal void TRoundRect::IBox(Rect *itsLocation)
  336.     {  
  337.         fOvalWidth = 10;
  338.         fOvalHeight = 10;
  339.         inherited::IBox(itsLocation);
  340.     }
  341.  
  342. pascal void TRoundRect::DrawShape()
  343. {
  344.     PenSize (fPenSize,fPenSize);
  345.     PenPat (fPenPat);
  346.     FillRoundRect(&fLocation,fOvalWidth,fOvalHeight,fFillPat);
  347.     FrameRoundRect(&fLocation,fOvalWidth,fOvalHeight);
  348.     inherited::DrawShape();
  349. }
  350.  
  351. pascal void TRoundRect::NeedDiskSpace(long *data)
  352. {
  353.     inherited::NeedDiskSpace(data);
  354.     data = data + sizeof(fOvalWidth) + sizeof(fOvalHeight);
  355. }
  356.  
  357. #ifdef qDebug
  358. pascal void TRoundRect::Fields(pascal void (*DoToField) (StringPtr fieldName,
  359.                         Ptr fieldAddr, short fieldType, void *link), void *link)
  360. {
  361.     DoToField("\pTRoundRect", nil, bClass, link);
  362.     DoToField("\pfOvalWidth", (Ptr) &fOvalWidth, bInteger, link);
  363.     DoToField("\pfOvalHeight", (Ptr) &fOvalHeight, bInteger, link);
  364.     inherited::Fields(DoToField, link);
  365. }
  366. #endif
  367.